import userMapper from "../../mappers/user/userMapper.js";
import redisClient from '../../config/redisClient.js';
import bcrypt from "bcryptjs";

/**
 * @description 创建用户
 * @param {Object} userData - 用户数据
 * @returns {Promise<string|null>} 返回错误信息或 null
 */
const createUser = async (userData) => {
    // 检查用户名是否已存在
    const existingUser = await userMapper.existingUser(userData);
    if (existingUser.length > 0) return '用户名已存在';

    // 使用 bcrypt 哈希密码并调用 Mapper 创建用户
    await userMapper.createUser(userData, await bcrypt.hash(userData.password, 10));
    return null;  // 返回 null 表示创建成功
};

/**
 * @description 登录用户
 * @param {string} username - 用户名
 * @param {string} password - 密码
 * @param {string} ipAddress - IP 地址
 * @returns {Promise<Object|string>} 返回用户信息或错误信息
 */
const loginUser = async (username, password, ipAddress) => {
    // 获取用户信息
    const user = await userMapper.getUserName(username, null);
    if (!user || user.length === 0) return '用户名不存在';

    // 验证密码
    const isPasswordValid = await bcrypt.compare(password, user[0].password);
    if (!isPasswordValid) return '密码错误';

    // 更新用户的最后登录信息
    await userMapper.loginUser(user, ipAddress);
    return user[0];  // 返回用户信息
};

/**
 * @description 获取所有用户
 * @param {number} userId - 当前用户 ID
 * @returns {Promise<Array>} 返回用户列表的 Promise 对象
 */
const getAllUsers = async () => {
    return await userMapper.getAllUsers();
};

/**
 * @description 更新用户
 * @param {number} userId - 用户 ID
 * @param {Object} userData - 更新的数据
 * @returns {Promise<string|null>} 返回错误信息或 null
 */
const updateUser = async (userId, userData) => {
    const existingUser = await userMapper.existingUser(userData);
    if (existingUser.length > 0) return '用户名已存在';

    const fields = Object.keys(userData).map(key => `${key} = :${key}`).join(', ');
    await userMapper.updateUser(fields, userData, userId);

    const user = await userMapper.getUserName(null, userId);
    const updateKey = `token:${userId}`;
    const redisDataString = await redisClient.get(updateKey);
    if (!redisDataString) return 'Redis 中无对应用户数据';

    const redisData = JSON.parse(redisDataString);
    if (!redisData.token || !redisData.expireTime) return 'Redis 中的 token 或 expireTime 缺失';

    // 删除旧的 Redis 数据
    await redisClient.del(updateKey);

    // 更新 Redis 数据，保留 token 并设置新的用户数据
    await redisClient.set(
        updateKey,
        JSON.stringify({
            user: user[0],
            token: redisData.token,
            expireTime: redisData.expireTime
        }),
        'EX',
        redisData.expireTime
    );

    return null;
};

/**
 * @description 逻辑删除用户
 * @param {Array<number>} userIds - 用户 ID 列表
 * @returns {Promise<null>} 返回 null
 */
const deleteUser = async (userIds) => {
    await userMapper.deleteUser(userIds);
    return null;
};

// 导出所有用户管理功能
export default {createUser, getAllUsers, loginUser, updateUser, deleteUser};
